package config

import (
	"fmt"
	"sync"

	"github.com/go-playground/validator/v10"
	"github.com/kelseyhightower/envconfig"
	"github.com/mcuadros/go-defaults"
	"github.com/sirupsen/logrus"
	corev1 "k8s.io/api/core/v1"
)

var (
	ec            = &EnvConfig{}
	envConfigOnce sync.Once
)

type EnvConfig struct {
	// user secret
	SpAccessKey    string `envconfig:"SP_ACCESS_KEY" validate:"required"`
	SpAccessSecret string `envconfig:"SP_ACCESS_SECRET" validate:"required"`

	// origin typescript code need NODE_CONFIG env for config info
	NodeConfig string `envconfig:"NODE_CONFIG" validate:"required"`

	// id env
	SpUserId string `envconfig:"SP_USER_ID" validate:"required"`
	SpAppId  string `envconfig:"SP_APP_ID" validate:"required"`
	SpNodeId string `envconfig:"SP_NODE_ID"`

	// other default env
	// 算盘web host
	SpHost string `envconfig:"SP_HOST" validate:"required"`
	// 算盘app master（router host），通过配置 ingress path（/{appId}  /socket/{appId}） 路由到不同的 app
	// 主要是为了给 前端、第三方服务 连接 app 所用（因为socket服务等原先（目前）都在 master（router）中）
	// SpApiHost string `envconfig:"SP_API_HOST" validate:"required"`
	// ...

	SpAppRouterHost string `envconfig:"SP_APP_ROUTER_HOST" default:"http://localhost:8000"`

	SpStorageConfig string `envconfig:"SP_STORAGE_CONFIG" default:""`
}

func GetEnvConfig() *EnvConfig {
	envConfigOnce.Do(func() {
		c, err := buildEnvConfig()
		if err != nil {
			logrus.Error(err)
		}

		ec = c
	})

	return ec
}

func buildEnvConfig() (*EnvConfig, error) {
	ec := &EnvConfig{}

	err := envconfig.Process("config", ec)
	if err != nil {
		return nil, fmt.Errorf("decode env variables failed: %v", err)
	}

	defaults.SetDefaults(ec)
	validate := validator.New()
	if err = validate.Struct(ec); err != nil {
		return nil, fmt.Errorf("validate env variables failed: %v", err)
	}

	return ec, nil
}

type SpStorageConfig struct {
	PVTemplate corev1.PersistentVolumeSpec `json:"pvTemplate"`
}
